#ifndef QIANDISK_INC_SOCKETMANAGER_H
#define QIANDISK_INC_SOCKETMANAGER_H


#include "qd_datas.h"
#include "qd_types.h"
#include "qd_utils.h"


#include <vector>
#include <map>

#include <stdio.h>
#include <string.h>
#include <math.h>

#include <errno.h>

namespace QD{

    // 创建 socket
    int CreateSocket(SocketInfo *socketInfo);

    // 服务端用于绑定和监听端口
    int BindAndListen(SocketInfo *socketInfo,int queue = 20);

    // 服务端阻塞获取客户端连接
    // cli fd         svr fd                   cli addr         cli len
    int Accept(SocketInfo *svr, SocketInfo *cli);

    // 客户端连接服务端
    //      cli fd       svr fd     svr addr
    int Connect(SocketInfo *svr);

    // 关闭 socket
    int Close(SocketInfo *sockInfo);

    // 创建 socketinfo
    int CreateSocketInfo(SocketInfo *sockInfo,const char *_ipStr, const int _port,  SocketType _type);


// ####### 以下暂时未使用
    int Recv(int fd, void *buff, int size, int flags = 0);

    int Send(int fd, void *buff, int size, int flags = 0);

    

};

#endif // #ifndef QIANDISK_INC_SOCKETMANAGER_H


class EndPoint{
   // 打开连接
   // 发起请求
public:
    int mFd;
    int mPort;
    struct sockaddr_in mAddr;
    socklen_t          mSocklen;

public:
    EndPoint() = default;
    EndPoint(const char *_ip, const int _port); // 初始化时连接
    ~EndPoint();

    
    EndPoint *RegistServer();   // 服务端bind listen
    EndPoint *Accept();         // 服务端  返回已连接的客户端

    EndPoint *Connect();        // 客户端 


    void Request(void *req, int reqSize, void *res, int resSize);  // 客户端

};